"""
面向对象，定义一个类
"""

class Animal:
    """
    抽象动物类
    """
    def eat(self):
        print("吃东西...")

class Cat(Animal):
    """
    猫类，继承父类动物类
    """

    # 定义构造方法
    def __init__(self, name, age):
        """
        定义构造方法，初始化对象
        """
        # 实例属性
        self.name = name
        self.age = age
        # 私有属性
        self.__sex = ""
        print("=" * 30)

    # 返回对象字符信息，重写了方法
    def __str__(self):
        """
        返回对象字符信息，重写了方法
        如果不重写调用默认的方法，打印地址信息
        """
        return "猫的名字：%s 猫的年龄：%d岁" % (self.name, self.age)

    # 释放对象时使用
    def __del__(self):
        print("%s被释放对象了..." % self.name)

    # 方法

    # 重写父类方法
    def eat(self):
        # 调用父类的方法， 两种方式
        Animal.eat(self)
        super().eat()
        print("%s吃鱼" % self.name)

    def drink(self):
        print("%s喝水" % self.name)

    def introduce(self):
        self.__introduce()

    # 私有方法，以双下划线开头
    def __introduce(self):
        print("猫的名字：%s 猫的年龄：%d岁" % (self.name, self.age))


import sys

# 创建一个对象
tom = Cat("Tom", 40)
print(tom)
# 添加属性
tom.eat()
tom.drink()
tom.introduce()

blue_cat = Cat("蓝猫", 20)
print(blue_cat)
blue_cat.eat()
blue_cat.drink()
blue_cat.introduce()

# 计算对象引用计数
tom_num = sys.getrefcount(tom) - 1
blue_num = sys.getrefcount(blue_cat) - 1
print("%d %d" % (tom_num, blue_num))

# 释放对象
del tom
del blue_cat
